package com.iwhalecloud.bss.kite.cucc.service.attr.linkhandler;

import com.iwhalecloud.bss.kite.cucc.service.attr.OrderModelCalculateHelper;
import com.iwhalecloud.bss.kite.cucc.service.attr.handler.OperationServicePriceAttrHandler;
import com.iwhalecloud.bss.kite.listener.handler.attr.annotation.AttrHandler;
import com.iwhalecloud.bss.kite.listener.handler.attr.impl.AbstractAttrLinkageHandler;
import com.iwhalecloud.bss.kite.manager.api.IQuerySceneInstService;
import com.iwhalecloud.bss.kite.manager.inst.KiteAttr;
import com.iwhalecloud.bss.kite.manager.inst.KiteInst;
import com.iwhalecloud.bss.kite.manager.inst.KiteProdInst;
import com.iwhalecloud.bss.kite.service.attr.AttrData;
import com.iwhalecloud.bss.kite.service.scene.attr.OperateInstAttrService;
import java.text.DecimalFormat;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 根据“远程支撑（小时/年）”和“驻场支撑（天/年）”计算“运维服务总结算价（万元）”
 * 运维服务总结算价（万元）=（运维服务-远程支撑结算价（元/小时）*运维服务-远程支撑（小时/年）+运维服务-驻场支撑结算价（元/天)*运维服务-驻场支撑（天/年））*运维服务订购年限（年）
 * 总结算价格（万元）=销售价格（万元）+运维服务总结算价（万元） 总销售价格（万元）=结算价格（万元）×版本折扣率（%）+运维服务总结算价（万元）
 */
@Service
@AttrHandler(OperationServicePriceAttrHandler.class)
public class OperationServicePriceAttrLinkHandler extends AbstractAttrLinkageHandler<AttrData> {

  @Autowired OperateInstAttrService operateInstAttrService;
  @Resource IQuerySceneInstService querySceneInstService;

  @Override
  public void handle(KiteAttr attr, KiteInst inst, AttrData data) {
    KiteAttr attr1 = inst.getAttr("210008115"); // 远程支撑（小时/年）
    KiteAttr attr2 = inst.getAttr("210008111"); // 运维服务-远程支撑结算价（元/小时）
    KiteAttr attr3 = inst.getAttr("210008117"); // 驻场支撑（天/年）
    KiteAttr attr4 = inst.getAttr("210008112"); // 驻场支撑结算价（元/天)
    KiteAttr attr5 = inst.getAttr("210008110"); // 销售价格
    KiteAttr attr6 = inst.getAttr("210008109"); // 结算价格
    KiteAttr attr7 = inst.getAttr("210008121"); // 版本折扣率
    KiteAttr attr8 = inst.getAttr("210008119"); // 运维服务订购年限（年）

    // 版本订购年限
    if("210008135".equals(attr.getFieldName())){
      List<KiteProdInst> kiteProdInstList = querySceneInstService.listProdInsts(data.getSceneInstId());
      // 附属产品
      List<KiteProdInst> collect = kiteProdInstList.stream()
          .filter(prodinst -> "63249687".equals(prodinst.getSpecId()))
          .collect(Collectors.toList());
      if(CollectionUtils.isNotEmpty(collect)){
          operateInstAttrService.setAttrValue(collect.get(0), "210008136", attr.getValue(), data.getSceneInstId(), null);
      }
    }

    Double d = 0.0;
    if (StringUtils.isNotEmpty(attr1.getValueDesc()) && StringUtils.isNotEmpty(attr2.getValue())) {
      d = Double.valueOf(attr1.getValueDesc()) * Double.valueOf(attr2.getValue());
    }
    if (StringUtils.isNotEmpty(attr3.getValueDesc()) && StringUtils.isNotEmpty(attr4.getValue())) {
      d += Double.valueOf(attr3.getValueDesc()) * Double.valueOf(attr4.getValue());
    }
    Double operationServiceYears = 0.0;
    if (StringUtils.isNotEmpty(attr8.getValueDesc())) {
      operationServiceYears = Double.valueOf(attr8.getValueDesc());
    }
    d = d * operationServiceYears / 10000;
    DecimalFormat df = new DecimalFormat("#.###");
    // 运维服务总结算价（万元）=（运维服务-远程支撑结算价（元/小时）*运维服务-远程支撑（小时/年）+运维服务-驻场支撑结算价（元/天)*运维服务-驻场支撑（天/年））*运维服务订购年限（年）
    operateInstAttrService.setAttrValue(inst, "210008120", doubleTrans(df.format(d)), data.getSceneInstId(), null);

    // 总结算价格（万元）=销售价格（万元）+运维服务总结算价（万元）
    operateInstAttrService.setAttrValue(inst,"210008123", doubleTrans(df.format(d + Double.valueOf(attr5.getValue()))), data.getSceneInstId(),null);

    Double versionCount = 1.0;
    if (StringUtils.isNotEmpty(attr7.getValue())) {
      versionCount = Double.valueOf(attr7.getValue()) / 100;
    }
    // 总销售价格（万元）=结算价格（万元）×版本折扣率（%）+运维服务总结算价（万元）
    Double d1 = Double.valueOf(StringUtils.isNotEmpty(attr6.getValue()) ? attr6.getValue() : attr6.getDefaultValue()) * versionCount + d;
    operateInstAttrService.setAttrValue(inst, "210008122", doubleTrans(df.format(d1)), data.getSceneInstId(), null);
  }

  @Override
  public void handleStyle(KiteAttr attr, KiteInst inst, AttrData data) {}

    private static String doubleTrans (String d){
        return OrderModelCalculateHelper.doubleTrans(d);
    }
}
